function testMicroAndMarcoTask() {
  console.log("main -- 1");

  setTimeout(() => {
    console.log("macrotask -- 1");
    setTimeout(() => {
      console.log("macrotask -- 1 -- a1");
    })

    new Promise((resolve) => {
      console.log("macrotask -- 1 -- i1");
      resolve();
    }).then(() => {
      console.log("macrotask -- 1 -- i2");
    })
    console.log("macrotask -- 2");
  }, 0)

  console.log("main -- 2");
  new Promise((resolve) => {
    console.log("main -- 2 -- i1");
    setTimeout(() => {
      console.log("main -- 2 -- i1 -- a1");
    })
    new Promise((resolve) => {
      console.log("main -- 1 -- i1 -- i1");
      resolve();
    }).then(() => {
      console.log("main -- 1 -- i1 -- i2");
    })
    resolve();
  }).then(() => {
    setTimeout(() => {
      console.log("main -- 2 -- i2 -- a1");
    })
    new Promise((resolve) => {
      console.log("main -- 1 -- i2 -- i1");
      resolve();
    }).then(() => {
      console.log("main -- 1 -- i2 -- i2");
    })
    console.log("main -- 2 -- i2");
  })
  console.log("main -- 3");

}

testMicroAndMarcoTask();

// main-- 1               √
// main-- 2               √
// main-- 2 -- i1         √
// main-- 1 -- i1-- i1    √
// main-- 3               √
// main-- 1 -- i1-- i2    √
// main-- 1 -- i2-- i1    √
// main-- 2 -- i2         √
// main-- 1 -- i2-- i2        --> 清空微任务， 包括后续添加的微任务
// macrotask-- 1          √
// macrotask-- 1 -- i1    √
// macrotask-- 2          √
// main-- 2 -- i1-- a1        --> 清空第一次的宏任务， 后续添加的宏任务呢？
// macrotask-- 1 -- i2        --> 开始清空第一次宏任务中的微任务， 后续添加的宏任务没有执行
// main-- 2 -- i2-- a1        --> 开始执行第二个宏任务
// macrotask-- 1 -- a1        --> 开始执行第一个中的第一个宏任务